﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using turnos.core.util;
using turnos.core.modelo;
using Reportman.Reporting;
using Reportman.Drawing.Forms;
using System.Configuration;

namespace turnos.escritorio
{
    public partial class frmAsignacionTurnos : Form
    {
        private AgendaDeTurnos _agenda;

        public AgendaDeTurnos AgendaSeleccionada
        {
            get { return _agenda; }
            set { _agenda = value; }
        }
        public frmAsignacionTurnos()
        {
            InitializeComponent();
        }

        private List<DataGridViewColumn> columnas_agenda()
        {
            List<DataGridViewColumn> retorno = new List<DataGridViewColumn>();

            DataGridViewColumn c = new DataGridViewTextBoxColumn();
            c.Name = "Identificacion";
            c.DataPropertyName = "IdTurno";
            c.Visible = false;
            retorno.Add(c);

            DataGridViewColumn c1 = new DataGridViewTextBoxColumn();
            c1.Name = "Fecha";
            c1.DataPropertyName = "Fecha";

            retorno.Add(c1);

            DataGridViewColumn c2 = new DataGridViewTextBoxColumn();
            c2.Name = "Hora Inicio";
            c2.DataPropertyName = "FechayHora";
            c2.DefaultCellStyle.Format = "hh:mm";

            retorno.Add(c2);

            DataGridViewColumn c3 = new DataGridViewTextBoxColumn();
            c3.Name = "Solicitante";
            c3.Width = 300;
            c3.DataPropertyName = "SolicitanteDescripcion";

            retorno.Add(c3);

            DataGridViewColumn c30 = new DataGridViewTextBoxColumn();
            c30.Name = "Tipo Trámite";
            c30.Width = 100;
            c30.DataPropertyName = "TipoTramiteDescripcion";

            retorno.Add(c30);

            DataGridViewColumn c4 = new DataGridViewTextBoxColumn();
            c4.Name = "Estado";
            c4.DataPropertyName = "EstadoDescripcion";

            retorno.Add(c4);

            return retorno;
        }

        private void cargarGrilla()
        {
            dgvAgenda.DataSource = Modelo.TurnosModelo.TurnosC.TraerAgendaPorFecha(dtpFecha.Value,null,null );
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            
        }

        private void frmAsignacionTurnos_Load(object sender, EventArgs e)
        {
            configurarRol();
            
            Modelo.TurnosModelo.ConfigurarDGV(dgvAgenda, columnas_agenda());

            dtpFecha.Value = DateTime.Now;

            cargarGrilla();
        }

        private void configurarRol()
        {
            if (Modelo.TurnosModelo.Usuario.Rol == "Administrador")
            {
                btnBlanquear.Visible = true;
                btnEliminar.Visible = true;
                btnSobreTurno.Visible = true;
                btnImprimir.Visible = true;
            }
            else
            {
                btnBlanquear.Visible = false;
                btnEliminar.Visible = false;
                btnSobreTurno.Visible = false;
                btnImprimir.Visible = false;
            }
        }

        private void dgvAgenda_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                seleccionaAgenda();
                if (AgendaSeleccionada.RefEstado != turnosCts.ID_ESTADO_LIBRE)
                    throw new turnosException("No esta libre el turno");
                //Abrir Carga de Solicitante
                frmAMSolicitante frmSol = new frmAMSolicitante();
                frmSol.AgendaSeleccionada = AgendaSeleccionada;
                frmSol.ShowDialog();
                cargarGrilla();

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error");
            }

        }

        private void seleccionaAgenda()
        {
            int idTurno = int.Parse(dgvAgenda.CurrentRow.Cells[0].Value.ToString());
            AgendaSeleccionada = Modelo.TurnosModelo.TurnosC.TraerAgendaPorId(idTurno);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (dgvAgenda.CurrentRow == null)
                MessageBox.Show(turnosCts.DEBE_SELECCIONAR_UN_ELEMENTO);
            else
                if (MessageBox.Show("¿Está seguro de desasociar el solicitante del turno?", "Confirmar", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    seleccionaAgenda();
                    Modelo.TurnosModelo.TurnosC.LimpiarSolicitanteAgenda(AgendaSeleccionada, Modelo.TurnosModelo.Usuario.Usuario);
                    MessageBox.Show("Se desasoció el solicitante del turno correctamente", "Confirmación");
                    cargarGrilla();
                }
        }

        private void button1_Click_1(object sender, EventArgs e)
        {
            if (dgvAgenda.CurrentRow != null)
            {
                seleccionaAgenda();

                frmSobreTurno frmSobreTurno = new frmSobreTurno();
                frmSobreTurno.AgendaSeleccionada.RefMatriz = this.AgendaSeleccionada.RefMatriz;
                frmSobreTurno.AgendaSeleccionada.MatrizDeTurnos = this.AgendaSeleccionada.MatrizDeTurnos;
                frmSobreTurno.AgendaSeleccionada.FechayHora = this.AgendaSeleccionada.FechayHora;
                frmSobreTurno.ShowDialog();

                cargarGrilla();
            }
            else
                MessageBox.Show("No existe la agenda, debe generar una agenda para esta fecha", "Error");

        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            if (dgvAgenda.CurrentRow == null)
                MessageBox.Show(turnosCts.DEBE_SELECCIONAR_UN_ELEMENTO);
            else
                if (MessageBox.Show("¿Está seguro de eliminar el turno?", "Confirmar", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    seleccionaAgenda();
                    Modelo.TurnosModelo.TurnosC.EliminarAgenda(AgendaSeleccionada);
                    MessageBox.Show("Se eliminó el turno correctamente", "Confirmación");
                    cargarGrilla();
                }
        }

        private void btnProximo_Click(object sender, EventArgs e)
        {
            //Actualiza la lista cada vez!
            cargarGrilla();
            if (dgvAgenda.CurrentRow == null)
                MessageBox.Show(turnosCts.DEBE_SELECCIONAR_UN_ELEMENTO);
            else
            {
                bool ok = false; int i = 0;

                while ((i < dgvAgenda.Rows.Count) && !(ok))
                {
                    int idTurno = int.Parse(dgvAgenda.Rows[i].Cells[0].Value.ToString());
                    AgendaSeleccionada = Modelo.TurnosModelo.TurnosC.TraerAgendaPorId(idTurno);
                    if (AgendaSeleccionada.RefEstado == turnosCts.ID_ESTADO_LIBRE)
                        ok = true;
                    i++;
                }
                if (ok)
                {
                    frmAMSolicitante frmSol = new frmAMSolicitante();
                    frmSol.AgendaSeleccionada = AgendaSeleccionada;
                    frmSol.ShowDialog();
                    cargarGrilla();
                }
                else
                    MessageBox.Show("No se encontraron turnos libres");
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            cargarGrilla();
        }

        

        private void dtpFecha_ValueChanged(object sender, EventArgs e)
        {
            cargarGrilla();
        }

        private void btnImprimir_Click(object sender, EventArgs e)
        {
            seleccionaAgenda();
            if (AgendaSeleccionada.RefEstado == turnosCts.ID_ESTADO_PENDIENTE)
                imprimir(AgendaSeleccionada.IdTurno);
            else
                MessageBox.Show("No esta en estado pendiente", "Informacion");
        }

        private void imprimir(int id)
        {
            Report rp = new Reportman.Reporting.Report();
            rp.LoadFromFile("comprobante.rep");
            string cnx = @ConfigurationManager.ConnectionStrings["Reportes"].ConnectionString;
            rp.DatabaseInfo[0].ProviderFactory = "System.Data.SqlClient";
            rp.DatabaseInfo[0].ConnectionString = cnx;
            rp.Params[0].Value = id;
            PrintOutWinForms prw = new PrintOutWinForms();
            prw.Preview = true;
            prw.Print(rp.MetaFile);
        }

        private void dgvAgenda_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }
    }
}
